package pl.peterjack.model.pdf.impl;

import java.io.IOException;
import java.io.OutputStream;
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import org.jdom.Element;

import pl.peterjack.SystemTools;
import pl.peterjack.model.Slownie;
import pl.peterjack.model.dane.Faktura;
import pl.peterjack.model.dane.FakturaProdukt;
import pl.peterjack.model.dane.Firma;
import pl.peterjack.model.jdo.FakturaJDO;
import pl.peterjack.model.pdf.PdfGenerator;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;

public class PdfGeneratorFaktura implements PdfGenerator {

	List<Faktura> faktury = new ArrayList<Faktura>();

	Element stylXML;

	public PdfGeneratorFaktura(Faktura faktura, Element stylXML) {
		faktury.add(faktura);
		this.stylXML = stylXML;
	}

	public PdfGeneratorFaktura(List<Faktura> faktury, Element stylXMl) {
		this.stylXML = stylXMl;
		this.faktury = faktury;
	}

	@Override
	public void generujPdf(OutputStream outputStream) throws DocumentException {
		Document document = new Document();
		PdfWriter writer = PdfWriter.getInstance(document, outputStream);
		document.open();
		for (Faktura f : faktury) {
			BaseFont helvetica = null;
			String czcionka = "";
			Integer wielkoscCzcionki = 14;

			try {
				czcionka = stylXML.getChild("czcionka").getChild("nazwa").getText();
				wielkoscCzcionki = Integer.parseInt(stylXML.getChild("czcionka")
						.getChild("wielkosc").getText());
			} catch (Exception e) {
				e.printStackTrace();
			}
			try {
				if ("times".equals(czcionka)) {
					helvetica = BaseFont.createFont(BaseFont.TIMES_ROMAN, BaseFont.CP1250,
							BaseFont.EMBEDDED);
				} else if ("courier".equals(czcionka)) {
					helvetica = BaseFont.createFont(BaseFont.COURIER, BaseFont.CP1250,
							BaseFont.EMBEDDED);
				} else {
					helvetica = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1250,
							BaseFont.EMBEDDED);
				}
			} catch (IOException e) {
				e.printStackTrace();
				return;
			}
			Firma firma = FakturaJDO.getFirma(f);
			Format formatter = new SimpleDateFormat("dd-MM-yy");
			String dataSprzedazyStr = "";
			String dataWystawieniaStr = "";
			if (f.getDataSprzedazy() != null) {
				dataSprzedazyStr = formatter.format(f.getDataSprzedazy());
			}
			if (f.getDataWystawienia() != null) {
				dataWystawieniaStr = formatter.format(f.getDataWystawienia());
			}

			Font helvetica16 = new Font(helvetica, wielkoscCzcionki);
			// new Paragraph("Śćźół:",helvetica16);

			Element firmaElement = stylXML.getChild("firma");
			Element statyczneElement = stylXML.getChild("statyczne");
			Element klientElement = stylXML.getChild("klient");
			Element numeryElement = stylXML.getChild("numery");
			Element tabelkaElement = stylXML.getChild("tabelka");
			Element podsumowanieElement = stylXML.getChild("podsumowanie");
			for (Element statycznyTekst : (List<Element>) statyczneElement.getChildren("statyczny")) {
				if (statycznyTekst.getChild("center") == null) {
					SystemTools.absText(
							SystemTools.nullToString(statycznyTekst.getChildText("tresc")),
							SystemTools.getXValueFromElement(statycznyTekst),
							SystemTools.getYValueFromElement(statycznyTekst), writer, helvetica,
							com.itextpdf.text.Element.ALIGN_LEFT);
				} else {
					SystemTools.absText(
							SystemTools.nullToString(statycznyTekst.getChildText("tresc")),
							SystemTools.getXValueFromElement(statycznyTekst),
							SystemTools.getYValueFromElement(statycznyTekst), writer, helvetica,
							com.itextpdf.text.Element.ALIGN_CENTER);
				}
			}
			SystemTools.absText(SystemTools.nullToString(f.getWlascicielNazwa()),
					SystemTools.getXValueFromElement(firmaElement.getChild("nazwa")),
					SystemTools.getYValueFromElement(firmaElement.getChild("nazwa")), writer,
					helvetica,
					com.itextpdf.text.Element.ALIGN_LEFT);
			SystemTools.absText(SystemTools.nullToString(f.getWlascicielAdres()),
					SystemTools.getXValueFromElement(firmaElement.getChild("adres")),
					SystemTools.getYValueFromElement(firmaElement.getChild("adres")), writer,
					helvetica,
					com.itextpdf.text.Element.ALIGN_LEFT);
			SystemTools.absText(SystemTools.nullToString(f.getWlascicielKodPocztowy()) + ", "
					+ SystemTools.nullToString(f.getWlascicielMiejscowosc()),
					SystemTools.getXValueFromElement(firmaElement.getChild("kod-miejscowosc")),
					SystemTools.getYValueFromElement(firmaElement.getChild("kod-miejscowosc")),
					writer,
					helvetica, com.itextpdf.text.Element.ALIGN_LEFT);
			SystemTools.absText(SystemTools.nullToString(f.getWlascicielNip()),
					SystemTools.getXValueFromElement(firmaElement.getChild("nip")),
					SystemTools.getYValueFromElement(firmaElement.getChild("nip")),
					writer,
					helvetica, com.itextpdf.text.Element.ALIGN_LEFT);
			SystemTools.absText(SystemTools.nullToString(firma.getTelefon()),
					SystemTools.getXValueFromElement(firmaElement.getChild("telefon")),
					SystemTools.getYValueFromElement(firmaElement.getChild("telefon")), writer,
					helvetica, com.itextpdf.text.Element.ALIGN_LEFT);

			SystemTools.absText(SystemTools.nullToString(f.getMiejscowosc()), 
					SystemTools.getXValueFromElement(firmaElement.getChild("miejscowosc")), 
					SystemTools.getYValueFromElement(firmaElement.getChild("miejscowosc")), writer,
					helvetica, com.itextpdf.text.Element.ALIGN_CENTER);
			SystemTools.absText(SystemTools.nullToString(dataSprzedazyStr),
					SystemTools.getXValueFromElement(firmaElement.getChild("data-sprzedazy")),
					SystemTools.getYValueFromElement(firmaElement.getChild("data-sprzedazy")),
					writer,
					helvetica, com.itextpdf.text.Element.ALIGN_CENTER);
			SystemTools.absText(SystemTools.nullToString(dataWystawieniaStr),
					SystemTools.getXValueFromElement(firmaElement.getChild("data-wystawienia")),
					SystemTools.getYValueFromElement(firmaElement.getChild("data-wystawienia")),
					writer,
					helvetica, com.itextpdf.text.Element.ALIGN_CENTER);

			SystemTools.absText(SystemTools.nullToString(f.getNazwa()),
					SystemTools.getXValueFromElement(klientElement.getChild("nazwa")),
					SystemTools.getYValueFromElement(klientElement.getChild("nazwa")), writer,
					helvetica, com.itextpdf.text.Element.ALIGN_LEFT);
			SystemTools.absText(SystemTools.nullToString(f.getAdres()),
					SystemTools.getXValueFromElement(klientElement.getChild("adres")),
					SystemTools.getYValueFromElement(klientElement.getChild("adres")), writer,
					helvetica, com.itextpdf.text.Element.ALIGN_LEFT);
			SystemTools.absText(
					SystemTools.nullToString(f.getKodPocztowy()) + ", "
							+ SystemTools.nullToString(f.getMiejscowosc()),
					SystemTools.getXValueFromElement(klientElement.getChild("kod-miejscowosc")),
					SystemTools.getYValueFromElement(klientElement.getChild("kod-miejscowosc")),
					writer,
					helvetica, com.itextpdf.text.Element.ALIGN_LEFT);

			if ("lewo".equals(numeryElement.getChildText("pozycja"))) {
				SystemTools.absText(
						"Faktura VAT nr " + SystemTools.nullToString(f.getNr()) + "/"
								+ SystemTools.nullToString(f.getMiesiac()) + "/"
								+ SystemTools.nullToString(f.getRok()) + " Orygina/Kopia",
						SystemTools.getXValueFromElement(numeryElement),
						SystemTools.getYValueFromElement(numeryElement), writer, helvetica,
						com.itextpdf.text.Element.ALIGN_LEFT);
			} else if ("prawo".equals(numeryElement.getChildText("pozycja"))) {
				SystemTools.absText(
						"Faktura VAT nr " + SystemTools.nullToString(f.getNr()) + "/"
								+ SystemTools.nullToString(f.getMiesiac()) + "/"
								+ SystemTools.nullToString(f.getRok()) + " Orygina/Kopia",
						SystemTools.getXValueFromElement(numeryElement),
						SystemTools.getYValueFromElement(numeryElement), writer, helvetica,
						com.itextpdf.text.Element.ALIGN_RIGHT);
			} else {
				SystemTools.absText(
						"Faktura VAT nr " + SystemTools.nullToString(f.getNr()) + "/"
								+ SystemTools.nullToString(f.getMiesiac()) + "/"
								+ SystemTools.nullToString(f.getRok()) + " Orygina/Kopia",
						SystemTools.getXValueFromElement(numeryElement),
						SystemTools.getYValueFromElement(numeryElement), writer, helvetica,
						com.itextpdf.text.Element.ALIGN_CENTER);
			}

			PdfPTable table = new PdfPTable(8);
			table.setTotalWidth(555);
			table.addCell(new Phrase(tabelkaElement.getChildText("lp"), new Font(helvetica,
					wielkoscCzcionki)));
			table.addCell(new Phrase(tabelkaElement.getChildText("nazwa"), new Font(helvetica,
					wielkoscCzcionki)));
			table.addCell(new Phrase(tabelkaElement.getChildText("ilosc"), new Font(helvetica,
					wielkoscCzcionki)));
			table.addCell(new Phrase(tabelkaElement.getChildText("cena-netto"), new Font(helvetica,
					wielkoscCzcionki)));
			table.addCell(new Phrase(tabelkaElement.getChildText("vat"), new Font(helvetica,
					wielkoscCzcionki)));
			table.addCell(new Phrase(tabelkaElement.getChildText("wartosc-netto"), new Font(
					helvetica, wielkoscCzcionki)));
			table.addCell(new Phrase(tabelkaElement.getChildText("vat"), new Font(helvetica,
					wielkoscCzcionki)));
			table.addCell(new Phrase(tabelkaElement.getChildText("wartosc-brutto"), new Font(
					helvetica, wielkoscCzcionki)));

			List<FakturaProdukt> fakturaProdukty = FakturaJDO.getFakturaProdukty(f);
			float razemNetto = 0;
			float razemBrutto = 0;
			for (int i = 0; i < fakturaProdukty.size(); i++) {

				table.addCell(new Phrase((i + 1) + "", new Font(helvetica, wielkoscCzcionki)));
				table.addCell(new Phrase(SystemTools
						.nullToString(fakturaProdukty.get(i).getNazwa()), new Font(helvetica,
						wielkoscCzcionki)));
				table.addCell(new Phrase(SystemTools
						.nullToString(fakturaProdukty.get(i).getIlosc()), new Font(helvetica,
						wielkoscCzcionki)));
				table.addCell(new Phrase(SystemTools.money(fakturaProdukty.get(i).getCenaNetto()),
						new Font(helvetica, wielkoscCzcionki)));
				table.addCell(new Phrase(SystemTools.money(fakturaProdukty.get(i).getProcentVat()),
						new Font(helvetica, wielkoscCzcionki)));
				table.addCell(new Phrase(SystemTools.money(fakturaProdukty.get(i).getCenaNetto()
						* fakturaProdukty.get(i).getIlosc()), new Font(helvetica, wielkoscCzcionki)));
				table.addCell(new Phrase(SystemTools.money(fakturaProdukty.get(i).getCenaBrutto()
						* fakturaProdukty.get(i).getIlosc() - fakturaProdukty.get(i).getCenaNetto()
						* fakturaProdukty.get(i).getIlosc()), new Font(helvetica, wielkoscCzcionki)));
				table.addCell(new Phrase(SystemTools.money(fakturaProdukty.get(i).getCenaBrutto()
						* fakturaProdukty.get(i).getIlosc()), new Font(helvetica, wielkoscCzcionki)));
				
				razemNetto += fakturaProdukty.get(i).getCenaNetto()
						* fakturaProdukty.get(i).getIlosc();
				razemBrutto += fakturaProdukty.get(i).getCenaBrutto()
						* fakturaProdukty.get(i).getIlosc();
			}
			// table.getTotalHeight()
			PdfContentByte canvas = writer.getDirectContent();
			table.writeSelectedRows(0, -1, 20, 580, canvas);

			SystemTools.absText("" + SystemTools.money(razemNetto),
					SystemTools.getXValueFromElement(podsumowanieElement.getChild("razem-netto")),
					SystemTools.getYValueFromElement(podsumowanieElement.getChild("razem-netto")),
					writer, helvetica,
					com.itextpdf.text.Element.ALIGN_LEFT);
			SystemTools.absText("" + SystemTools.money(razemBrutto - razemNetto),
					SystemTools.getXValueFromElement(podsumowanieElement.getChild("razem-vat")),
					SystemTools.getYValueFromElement(podsumowanieElement.getChild("razem-vat")),
					writer,
					helvetica, com.itextpdf.text.Element.ALIGN_LEFT);

			SystemTools.absText("" + SystemTools.money(razemBrutto),
					SystemTools.getXValueFromElement(podsumowanieElement.getChild("razem-brutto")),
					SystemTools.getYValueFromElement(podsumowanieElement.getChild("razem-brutto")),
					writer, helvetica,
					com.itextpdf.text.Element.ALIGN_LEFT);

			try {
				SystemTools.absText("" + Slownie.procKwotaSlownie(razemBrutto),
						SystemTools.getXValueFromElement(podsumowanieElement.getChild("slownie")),
						SystemTools.getYValueFromElement(podsumowanieElement.getChild("slownie")),
						writer, helvetica, com.itextpdf.text.Element.ALIGN_LEFT);
			} catch (Exception e) {

			}
		}
		document.close();
	}

}
